package cn.tao.base.service.impl;

import cn.tao.base.service.ICodeService;
import cn.tao.utils.SendMsgUtils;
import cn.tao.utils.StrUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class CodeServiceImpl implements ICodeService {
    //注入redis核心对象
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void senCode(Map<String, String> map) throws Exception{
        //拿到前端用户提交的手机号，以及用户是什么操作
        String phone = map.get("phone");
        String codeType = map.get("codeType");
        //存储到redis中是键值对的形式
        /*  key                 value
            phone            codeType
            "13330964750" 	"REGISTER"
            前端返回的数据，可以选择对象封装，比较麻烦
         */
        String codeInRedis = (String) redisTemplate.opsForValue().get(phone+":"+codeType);
        //通过工具类获取6位的随机验证码
        String code = StrUtils.getRandomString(6);
        //不为空说明不是第一次发送
        if (codeInRedis!=null){
            //获取上一次存储验证码的时间,通过分割code和时间戳 把字符串转为Long
            Long time = Long.valueOf(codeInRedis.split(":")[1]);
            //判断时间是否在1分钟内
            if (System.currentTimeMillis()-time<60*1000){
                throw new Exception("操作过于频繁，请稍后再试");
            }else {
                //当用户正常操作进入再次获取验证码时 ，把之前的验证码覆盖新创建的
                code = codeInRedis.split(":")[0];
            }
        }
        System.out.println("本次验证码:"+code);
        //通过短信工具类发送短信,放入前端传递的电话，和我们随机生成的验证码
        SendMsgUtils.sendCode(phone,code);
        //把code放入redis中
        redisTemplate.opsForValue().set(phone+":"+codeType,code+":"+System.currentTimeMillis(),5, TimeUnit.MINUTES);

    }
}
